package ejbs;

import java.sql.Date;
import java.util.ArrayList;
import java.util.Iterator;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import com.thoughtworks.xstream.XStream;
import entities.*;
@SuppressWarnings(value = { "all" })
@Stateless
public class FacadeBean implements Facade {
	
	@EJB
	private AdmCotizaciones admCotizaciones;
	@EJB
	private AdmCompras admCompras;
	@EJB
	private AdmProductos admArticulos;
	@EJB
	private AdmFacturas admFacturas;
	

	public Producto obtenerArticulo(String codigo) {
		return admArticulos.obtenerArticulo(codigo);
	}

	public ArrayList<Producto> obtenerArticulos() {
		return admArticulos.obtenerArticulos();
	}
	
	public ArrayList<Producto> obtenerArticulos(int nuemeroDePagina)
	{
		return admArticulos.obtenerArticulos(nuemeroDePagina);
	}
	
	public int obtenerTotalDePaginas()
	{
		return admArticulos.obtenerTotalDePaginas();
	}

	public Producto crearArticulo(String cod, String car, String marc,
			String orig, String desc) {
		return admArticulos.crearArticulo(cod, car, marc, orig, desc);
	}

	public Producto cargarArticulo(Producto art) {
		return admArticulos.cargarArticulo(art);
	}

	public void eliminarArticulo(String codigo) {
		admArticulos.eliminarArticulo(codigo);
	}

	public void solicitarCompra(SolicitudCompra solicitudCompra) {
		
		if (solicitudCompra != null)
		{
			admCompras.solicitarCompra(solicitudCompra);
			//simularRespuestaAsincronica(solicitudCompra);
		}
	}
	
	public Cotizacion cotizar(SolicitudCotizacion solicitudCotizacion) {
		return admCotizaciones.cotizar(solicitudCotizacion);
	}
	
	public ArrayList<SolicitudCotizacion> obtenerSolicitudesCotizacion() {
		return admCotizaciones.obtenerSolicitudesCotizacion();
	}

	public ArrayList<SolicitudCompra> obtenerSolicitudesCompra() {
		return admCompras.obtenerSolicitudesCompra();
	}
	
	public ArrayList<Cotizacion> obtenerCotizaciones() {
		return admCotizaciones.obtenerCotizaciones();
	}

	public Cotizacion obtenerUltimaCotizacion(String codigoArticulo) {
		return admCotizaciones.obtenerUltimaCotizacion(codigoArticulo);
	}

	public void recibirFactura(Factura factura) {
		admFacturas.recibirFactura(factura);
	}

	public ArrayList<Factura> obtenerFacturasRecibidas() {
		return admFacturas.obtenerFacturasRecibidas();
	}
	
	
	public double prueba() {
			return 8;
	}
	
	// ESTOS DOS METODOS SON PARA SIMULAR LA LLAMADA ASINCRONICA
	private void simularRespuestaAsincronica(SolicitudCompra solicitudCompra)
	{
		Factura factura = new Factura();
		factura.setFecha(new Date(System.currentTimeMillis()));
		
		Iterator<ItemAComprar> itr = solicitudCompra.getItemsAComprar().iterator();
		
		while(itr.hasNext())
		{
			ItemAComprar itemAComprar = itr.next();
			ItemFacturado itemFacturado = new ItemFacturado();
			itemFacturado.setCodigo(itemAComprar.getCodigo());
			itemFacturado.setCantidad(itemAComprar.getCantidad());
			itemFacturado.setPrecio(2.0);
			itemFacturado.setFactura(factura);
			factura.getItemsFacturados().add(itemFacturado);
		}
		
		XStream xStream = new XStream();
		xStream.alias("factura", Factura.class);
		String xmlFactura = xStream.toXML(factura);
		onMessage(xmlFactura);
	}
	
	//public void onMessage(Message message) throws JMSException 
	public void onMessage(String xmlFactura)
	{
		// Aca llega la respuesta asincronica de la compra, con la factura asociada		
		//TextMessage textMessage = (TextMessage)message;
		//String xmlFactura = textMessage.getText();
		
		XStream xStream = new XStream();
		xStream.alias("factura", Factura.class);
		Factura factura = (Factura)xStream.fromXML(xmlFactura);
		this.recibirFactura(factura);
    }
	
}
